package com.fjbdxk.beidou.core;

import com.fjbdxk.beidou.msg.BDFKIMessage;
import com.fjbdxk.beidou.msg.CCTCQMessage;

/**
 *描述与北斗卫星通信网络的连接和消息交互的基本功能
 * @author huanggy
 * @version 1.0.0
 * @date 2024/05/13
 **/
public abstract class AbstractBeiDouNet {
    /**
     * 打开连接
     */
    public abstract boolean open();

    /**
     * 关闭连接
     */
    public abstract boolean close();

    /**
     * 发送消息
     *处理发送消息的逻辑，并决定如何解析反馈消息
     * @param message
     * @return 返回反馈消息，目前仅支持CCTCQMessage的反馈消息BDFKIMessage，其余返回null
     */
    public AbstractBeiDouMessage sendMessage(AbstractBeiDouMessage message) {//需要发送的消息对象
        String receivedMessage = doSend(message);
        if (message instanceof CCTCQMessage) {//AbstractBeiDouMessage，如果发送的是 CCTCQMessage 类型的消息，会解析并返回相应的 BDFKIMessage 反馈消息
            return parseFKIResp(receivedMessage);
        } else {
            return null;
        }
    }

    /**
     * 发送消息
     *
     * @param message
     * @return 反馈消息，只能反馈一条
     */
    public abstract String doSend(AbstractBeiDouMessage message);


    /**
     * 默认FKI消息解析，如果多条反馈消息，只取最新的FKI
     *解析接收到的消息字符串并提取最后一条 BDFKIMessage 消息
     * @param receivedMessage
     * @return
     */
    public BDFKIMessage parseFKIResp(String receivedMessage) {//接收到的消息字符串
        if (receivedMessage.lastIndexOf(AbstractBeiDouMessage.BEGIN_CHAR) != 0) {
            // 最后一条FKI消息开始位置
            int lastFKIIndex = receivedMessage.lastIndexOf(new BDFKIMessage().getType());
            // 下一条消息开始位置
            int nextResIndex = receivedMessage.indexOf(AbstractBeiDouMessage.BEGIN_CHAR, lastFKIIndex);
            if (lastFKIIndex == nextResIndex || nextResIndex == -1) {//判断并提取 FKI 消息
                return new BDFKIMessage().from(receivedMessage.substring(lastFKIIndex - 1));
            } else {
                return new BDFKIMessage().from(receivedMessage.substring(lastFKIIndex - 1, nextResIndex));
            }
        } else {
            //处理没有有效消息的情况
            return new BDFKIMessage().from(receivedMessage);
        }
    }
}
